home *** CD-ROM | disk | FTP | other *** search
/ STraTOS 1997 April & May / STraTOS 1 - 1997 April & May.iso / CD01 / PRGMANIA / VERSION1.5 / USERDEFS.C < prev    next >
Encoding:
C/C++ Source or Header  |  1996-12-27  |  17.2 KB  |  552 lines

  1. /*************************************************************************
  2.  * Fonctions de gestion des boutons UserDefs.                            *
  3.  *                                                                       *
  4.  * Dernière mise à jour : 29/02/1996                                     *
  5.  *************************************************************************/
  6.  
  7. #include "WindGem.h"
  8. #include "winproto.h"
  9. #include "user.h"
  10.  
  11. #ifndef ACTIVATOR
  12. #define ACTIVATOR            0x600
  13. #endif
  14. #define USR_INDICATOR    0x800
  15. #define USR_ACTIVATOR    0x1800
  16.  
  17. /*-=< Section déclaration >=---------------------------------------------*/
  18. static void coordonnees (void);
  19. int cdecl under_button(PARMBLK *parmblock);
  20. int cdecl check_button (PARMBLK *parmblock);
  21. int cdecl popup_button (PARMBLK *parmblock);
  22. int cdecl group_button (PARMBLK *parmblock);
  23. static void set_objc(OBJECT *addr_obj, int cdecl (*code)(PARMBLK *parmblock));
  24.  
  25. /*-=< Gestion de l'affichage des boutons UserDefs >=---------------------*/
  26.  
  27. /*-----------------------------------------------------------------------*
  28.  * Raccourcis clavier.                                                   *
  29.  *-----------------------------------------------------------------------*/
  30. int cdecl under_button(PARMBLK *parmblock)
  31. {
  32.     register int flags, x, y, w, h, test = 0, under_pos, tx, ty; 
  33.     register int back_color, lb_color, lh_color, txt_color = BLACK, xtype;
  34.     register int char_height, cell_height, dummy;
  35.     register char *string, *key_short;
  36.     int tab[4], xy_bar[8], attributs[10];
  37.     char chaine[60];
  38.  
  39.     fill_tab (tab, 4,                                         /* Zone de clip */
  40.                             parmblock->pb_xc, parmblock->pb_yc,
  41.                             parmblock->pb_wc + parmblock->pb_xc - 1,
  42.                             parmblock->pb_hc + parmblock->pb_yc - 1);
  43.     vs_clip (Sys->VdiHandle, TRUE, tab);                          /* Clip ON */
  44.  
  45.     flags = parmblock->pb_tree[parmblock->pb_obj].ob_flags;
  46.     xtype = parmblock->pb_tree[parmblock->pb_obj].ob_type >> 8;
  47.     string = (char *) parmblock->pb_parm;
  48.  
  49.     x = parmblock->pb_x;
  50.     y = parmblock->pb_y;
  51.     w = parmblock->pb_w;
  52.     h = parmblock->pb_h;
  53.  
  54.     vqt_attributes(Sys->VdiHandle, attributs);
  55.     if (xtype == SMALL_B)
  56.         char_height = 4;    /* Petite fonte systeme. */
  57.     else
  58.         char_height = attributs[7];
  59.     vst_height(Sys->VdiHandle, char_height, &dummy, &char_height, &dummy, &cell_height);
  60.  
  61.     /* CALCUL DU TEXTE */
  62.     if ((key_short = strchr(string, '[')) != 0)
  63.     {
  64.         strnpcpy(chaine, string,key_short);
  65.         vqt_extent(Sys->VdiHandle, chaine, xy_bar);
  66.         under_pos = xy_bar[2];     /* Position du souligne */
  67.         key_short++;
  68.         strcat(chaine,key_short);
  69.     }
  70.     else
  71.         strcpy(chaine, string);
  72.  
  73.     vqt_extent(Sys->VdiHandle, chaine, xy_bar);
  74.     tx = x + (w - xy_bar[2])/2;
  75.     ty = y + (char_height + (h - cell_height)/2);
  76.  
  77.     if (xtype != SMALL_B)
  78.     {
  79.         x -= 3; y -= 3; w += 5; h += 5;
  80.     }
  81.     else
  82.         ty++;
  83.     if ((flags & USR_ACTIVATOR) != 0)
  84.     {
  85.         x -= 2; y -= 2; w += 4; h += 4;                          /* Pour la 3 D ! */
  86.     }
  87.     xy_bar[0] = x; xy_bar[1] = y;
  88.     xy_bar[2] = x + w; xy_bar[3] = y + h;
  89.     
  90.     vswr_mode(Sys->VdiHandle, MD_REPLACE);
  91.     if ((parmblock->pb_currstate & OUTLINED) != 0)
  92.     {
  93.         vsf_color(Sys->VdiHandle, WHITE);                     /* Pour OUTLINED ...*/
  94.         vsf_interior(Sys->VdiHandle, 1);
  95.         v_bar(Sys->VdiHandle, xy_bar);            /* ..dessin du fond de l'objet */
  96.     }
  97.     else
  98.     {
  99.         if (flags & DEFAULT)
  100.             test++;                                        /* Un cadre pour "DEFAULT" */
  101.         if (flags & EXIT)
  102.             test++;                                        /* Un cadre pour "EXIT"    */
  103.     }
  104.     vsf_interior(Sys->VdiHandle ,0);
  105.     vswr_mode(Sys->VdiHandle, MD_TRANS);
  106.  
  107.     vsf_color(Sys->VdiHandle, BLACK);                /* Couleur des cadres         */
  108.  
  109.     if ((parmblock->pb_currstate & OUTLINED) != 0 || test == 2)
  110.     {
  111.         v_bar(Sys->VdiHandle, xy_bar);                /* Cadre Exterieur         */
  112.         test--;
  113.     }
  114.     xy_bar[0] ++; xy_bar[1] ++;
  115.     xy_bar[2] --; xy_bar[3] --;
  116.  
  117.     if (test > 0)
  118.         v_bar(Sys->VdiHandle, xy_bar);                 /* Cadre Intermediaire    */
  119.         xy_bar[0] ++;    xy_bar[1] ++;
  120.         xy_bar[2] --;    xy_bar[3] --;
  121.  
  122.     if ((parmblock->pb_currstate & OUTLINED) == 0) /* Cadre Interieur      */
  123.         v_bar(Sys->VdiHandle, xy_bar);
  124.     xy_bar[0] ++;    xy_bar[1] ++;
  125.     xy_bar[2] --;    xy_bar[3] --;
  126.  
  127.     flags &= USR_ACTIVATOR;
  128.     if (flags)
  129.     {
  130.         back_color = Sys->color_3d1;
  131.         if ((parmblock->pb_currstate & SELECTED) == 0)
  132.         {
  133.             lh_color = WHITE;
  134.             lb_color = Sys->color_3d2;
  135.             if (flags == USR_ACTIVATOR)
  136.             {    /* ACTIVATOR et NORMAL */
  137.                 tx--; ty--;
  138.             }
  139.         }
  140.         else
  141.         {
  142.             lh_color = BLACK;
  143.             lb_color = WHITE;
  144.             if (flags == USR_INDICATOR)
  145.             {    /* INDICATOR et SELECTED */
  146.                 back_color = Sys->color_3d2;
  147.                 txt_color = WHITE;
  148.                 lb_color = Sys->color_3d1;
  149.             }
  150.         }
  151.     }
  152.     else if ((parmblock->pb_currstate & SELECTED) != 0)
  153.     {
  154.         txt_color = WHITE;
  155.         back_color = BLACK;
  156.     }
  157.     else
  158.     {
  159.         back_color = WHITE;
  160.     }
  161.     vsf_interior(Sys->VdiHandle, 1);
  162.     vsf_color(Sys->VdiHandle, back_color);
  163.     v_bar(Sys->VdiHandle, xy_bar);        /* Remplissage Interieur du bouton */
  164.  
  165.     if (flags)
  166.     {
  167.         xy_bar[0]++;
  168.         xy_bar[4] = xy_bar[2];
  169.         xy_bar[5] = xy_bar[1] +1;
  170.         xy_bar[1] = xy_bar[3];
  171.         vsl_color(Sys->VdiHandle, lb_color);
  172.         v_pline(Sys->VdiHandle, 3, xy_bar);      /* Trace ligne basse et droite */
  173.         xy_bar[0]--; xy_bar[5]--;
  174.         xy_bar[2] = xy_bar[0];
  175.         xy_bar[3] = xy_bar[5];
  176.         xy_bar[1]--;xy_bar[4]--;
  177.         vsl_color(Sys->VdiHandle, lh_color);
  178.         v_pline(Sys->VdiHandle, 3, xy_bar);      /* Trace ligne gauche et haute */
  179.     }
  180.     vst_color(Sys->VdiHandle, txt_color);
  181.     v_gtext(Sys->VdiHandle, tx, ty, chaine);
  182.     if (key_short != 0)
  183.     {
  184.         vst_color(Sys->VdiHandle, RED);              /* Couleur de soulignement */
  185.         vst_effects(Sys->VdiHandle, 8);              /* mode "Souligne"           */
  186.         v_gtext(Sys->VdiHandle, tx + under_pos, ty, " ");
  187.         vst_effects(Sys->VdiHandle, 0);              /* mode "Normal"           */
  188.     }
  189.     vswr_mode(Sys->VdiHandle, MD_REPLACE);
  190.     vst_color(Sys->VdiHandle, BLACK);
  191.     vst_height(Sys->VdiHandle, attributs[7], &dummy, &dummy, &dummy, &dummy);
  192.     
  193.     vs_clip(Sys->VdiHandle, FALSE, tab);    
  194.     
  195.     return (parmblock->pb_currstate & DISABLED);
  196. }
  197.  
  198. /*-----------------------------------------------------------------------*
  199.  * Radio-boutons et Check-box.                                           *
  200.  *-----------------------------------------------------------------------*/
  201. int cdecl check_button (PARMBLK *parmblock)
  202. {
  203.     register int tab[4], pxy[8], pox, poy, sel, obj, color[2];
  204.     register char *texte;
  205.     int dummy;
  206.     MFDB nul = {0}, pic, msk;
  207.  
  208.     vst_font (Sys->VdiHandle, 1);
  209.     fill_tab (tab, 4,                                         /* Zone de clip */
  210.                             parmblock->pb_xc, parmblock->pb_yc,
  211.                             parmblock->pb_wc + parmblock->pb_xc - 1,
  212.                             parmblock->pb_hc + parmblock->pb_yc - 1);
  213.     vs_clip (Sys->VdiHandle, TRUE, tab);                          /* Clip ON */
  214.  
  215.     sel = parmblock->pb_currstate & SELECTED;
  216.     if (parmblock->pb_tree[parmblock->pb_obj].ob_flags & RBUTTON)
  217.         obj = sel ? RBS : RBN;
  218.     else
  219.         obj = sel ? BCS : BCN;
  220.  
  221.     pic.fd_addr = (void *) (Sys->AdrUser)[obj].ob_spec.iconblk->ib_pdata;
  222.     msk.fd_addr = (void *) (Sys->AdrUser)[obj].ob_spec.iconblk->ib_pmask;
  223.     pic.fd_w = msk.fd_w = 16;
  224.     pic.fd_h = msk.fd_h = 16;
  225.     pic.fd_wdwidth = msk.fd_wdwidth = 1;
  226.     pic.fd_nplanes = msk.fd_nplanes = 1;
  227.     pic.fd_stand = msk.fd_stand = ZERO;
  228.  
  229.     fill_tab (pxy, 8,
  230.                         ZERO, ZERO, pic.fd_w - 1, pic.fd_h - 1,
  231.                         parmblock->pb_x, parmblock->pb_y,
  232.                         parmblock->pb_x + pic.fd_w - 1,
  233.                         parmblock->pb_y + pic.fd_h - 1);
  234.  
  235.     color[0] = WHITE;
  236.     color[1] = WHITE;
  237.     vrt_cpyfm (Sys->VdiHandle, MD_TRANS, pxy, &msk, &nul, color);
  238.     color[0] = BLACK;
  239.     vrt_cpyfm (Sys->VdiHandle, MD_TRANS, pxy, &pic, &nul, color);
  240.  
  241.     texte = (char *)parmblock->pb_parm;    /* Récupérer pointeur sur le texte */
  242.     vst_color (Sys->VdiHandle, BLACK);
  243.     vst_alignment (Sys->VdiHandle, 0, 5, &dummy, &dummy);
  244.     vswr_mode (Sys->VdiHandle, MD_TRANS);          /* Texte en mode transparent */
  245.     vst_effects (Sys->VdiHandle, ZERO);           /* Désactiver tous les effets */
  246.     pox = parmblock->pb_x + Sys->Hchar + Sys->Wchar;            /* Position en x */
  247.     poy = parmblock->pb_y;                                                /* et en y.      */
  248.     if (Sys->Yres < 399)
  249.         poy += 4;
  250.  
  251.     v_gtext (Sys->VdiHandle, pox, poy, texte);              /* écrire.       */
  252.     vst_alignment (Sys->VdiHandle, 0, 0, &dummy, &dummy);    /* necessaire !! */
  253.  
  254.     vs_clip (Sys->VdiHandle, FALSE, tab);                    /* Clip OFF      */
  255.  
  256.     return (parmblock->pb_currstate & ~SELECTED);
  257. }
  258.  
  259. /*-----------------------------------------------------------------------*
  260.  * PopUp-boutons                                                         *
  261.  *-----------------------------------------------------------------------*/
  262. int cdecl popup_button (PARMBLK *parmblock)
  263. {
  264.     register int flags, x, y, w, h, test = 0, tx, ty; 
  265.     register int back_color, lb_color, lh_color, sel, obj;
  266.     register char *texte;
  267.     int tab[4], pxy[8], color[2], xy_bar[8];
  268.     MFDB nul = {0}, pic, msk;
  269.  
  270.     vst_font (Sys->VdiHandle, 1);
  271.     fill_tab (tab, 4,                                         /* Zone de clip */
  272.                             parmblock->pb_xc, parmblock->pb_yc,
  273.                             parmblock->pb_wc + parmblock->pb_xc - 1,
  274.                             parmblock->pb_hc + parmblock->pb_yc - 1);
  275.     vs_clip (Sys->VdiHandle, TRUE, tab);                          /* Clip ON */
  276.  
  277.     sel = parmblock->pb_currstate & SELECTED;
  278.     obj = sel ? CYCOFF : CYCON;
  279.  
  280.     /* Préparation affichage de l'icone */
  281.     pic.fd_addr = (void *) (Sys->AdrUser)[obj].ob_spec.iconblk->ib_pdata;
  282.     msk.fd_addr = (void *) (Sys->AdrUser)[obj].ob_spec.iconblk->ib_pmask;
  283.     pic.fd_w = msk.fd_w = 16;
  284.     pic.fd_h = msk.fd_h = 16;
  285.     pic.fd_wdwidth = msk.fd_wdwidth = 1;
  286.     pic.fd_nplanes = msk.fd_nplanes = 1;
  287.     pic.fd_stand = msk.fd_stand = ZERO;
  288.  
  289.     /* Récupère les attributs et les coordonnées de l'objet */
  290.     flags = parmblock->pb_tree[parmblock->pb_obj].ob_flags;
  291.     x = parmblock->pb_x;
  292.     y = parmblock->pb_y;
  293.     w = parmblock->pb_w;
  294.     h = parmblock->pb_h;
  295.  
  296.     tx = x + 4;
  297.     ty = y + Sys->Hchar - 3;
  298.  
  299.     if ((flags & USR_ACTIVATOR) != 0)
  300.     {
  301.         x -= 2; y -= 2; w += 4; h += 4;                          /* Pour la 3 D ! */
  302.     }
  303.     xy_bar[0] = x; xy_bar[1] = y;
  304.     xy_bar[2] = x + w - 17; xy_bar[3] = y + h - 1;
  305.  
  306.     if (flags & EXIT)
  307.         test++;                                             /* Un cadre pour "EXIT"    */
  308.  
  309.     vsf_interior(Sys->VdiHandle ,0);
  310.     vswr_mode(Sys->VdiHandle, MD_TRANS);
  311.     vsf_color(Sys->VdiHandle, BLACK);                /* Couleur des cadres         */
  312.  
  313.     if (test > 0)
  314.         v_bar(Sys->VdiHandle, xy_bar);                 /* Cadre Intermediaire    */
  315.         xy_bar[0] ++;    xy_bar[1] ++;
  316.         xy_bar[2] --;    xy_bar[3] --;
  317.  
  318.     xy_bar[0] ++;    xy_bar[1] ++;
  319.     xy_bar[2] --;    xy_bar[3] --;
  320.  
  321.     flags &= USR_ACTIVATOR;
  322.     if (flags)
  323.     {
  324.         back_color = Sys->color_3d1;
  325.         if (! sel)
  326.         {
  327.             if (Sys->Nplane < 4)
  328.                 lh_color = BLACK;
  329.             else
  330.                 lh_color = WHITE;
  331.             lb_color = Sys->color_3d2;
  332.             if (flags == USR_ACTIVATOR)
  333.             {    /* ACTIVATOR et NORMAL */
  334.                 tx--; ty--;
  335.             }
  336.         }
  337.         else
  338.         {
  339.             lh_color = BLACK;
  340.             if (Sys->Nplane < 4)
  341.                 lb_color = BLACK;
  342.             else
  343.                 lb_color = WHITE;
  344.             if (flags == USR_INDICATOR)
  345.             {    /* INDICATOR et SELECTED */
  346.                 back_color = Sys->color_3d2;
  347.                 lb_color = Sys->color_3d1;
  348.             }
  349.         }
  350.     }
  351.     else if (sel)
  352.         back_color = BLACK;
  353.     else
  354.         back_color = WHITE;
  355.  
  356.     vsf_interior(Sys->VdiHandle, 1);
  357.     vsf_color(Sys->VdiHandle, back_color);
  358.     v_bar(Sys->VdiHandle, xy_bar);        /* Remplissage Interieur du bouton */
  359.  
  360.     if (flags)
  361.     {
  362.         xy_bar[0]++;
  363.         xy_bar[4] = xy_bar[2];
  364.         xy_bar[5] = xy_bar[1] +1;
  365.         xy_bar[1] = xy_bar[3];
  366.         vsl_color(Sys->VdiHandle, lb_color);
  367.         v_pline(Sys->VdiHandle, 3, xy_bar);      /* Trace ligne basse et droite */
  368.         xy_bar[0]--; xy_bar[5]--;
  369.         xy_bar[2] = xy_bar[0];
  370.         xy_bar[3] = xy_bar[5];
  371.         xy_bar[1]--;xy_bar[4]--;
  372.         vsl_color(Sys->VdiHandle, lh_color);
  373.         v_pline(Sys->VdiHandle, 3, xy_bar);      /* Trace ligne gauche et haute */
  374.     }
  375.  
  376.     /* Affichage de l'icone */
  377.     fill_tab (pxy, 8,
  378.                         ZERO, ZERO, pic.fd_w - 1, pic.fd_h - 1,
  379.                         parmblock->pb_x + parmblock->pb_w - 16, parmblock->pb_y,
  380.                         parmblock->pb_x + parmblock->pb_w - 16 + pic.fd_w - 1,
  381.                         parmblock->pb_y + pic.fd_h - 1);
  382.                         
  383.     color[0] = WHITE;
  384.     color[1] = WHITE;
  385.     vrt_cpyfm (Sys->VdiHandle, MD_TRANS, pxy, &msk, &nul, color);
  386.     color[0] = BLACK;
  387.     vrt_cpyfm (Sys->VdiHandle, MD_TRANS, pxy, &pic, &nul, color);
  388.  
  389.     /* Affichage du texte */
  390.     texte = (char *) parmblock->pb_parm;
  391.     vst_color (Sys->VdiHandle, BLACK);
  392.     vst_effects (Sys->VdiHandle, ZERO);
  393.     if (Sys->Yres < 399)
  394.         ty += 4;
  395.     v_gtext (Sys->VdiHandle, tx, ty, texte);
  396.     vswr_mode(Sys->VdiHandle, MD_REPLACE);
  397.  
  398.     vs_clip (Sys->VdiHandle, FALSE, tab);
  399.  
  400.     return (parmblock->pb_currstate & ~SELECTED);
  401. }
  402.  
  403. /*-----------------------------------------------------------------------*
  404.  * Groupe...                                                             *
  405.  *-----------------------------------------------------------------------*/
  406. int cdecl group_button (PARMBLK *parmblock)
  407. {
  408.     register int x, y, w, h, tx, ty; 
  409.     register int back_color, lb_color, lh_color;
  410.     register char *texte;
  411.     int tab[4], xy_bar[8];
  412.  
  413.     vst_font (Sys->VdiHandle, 1);
  414.     /* Zone de Clip */
  415.     fill_tab (tab, 4, parmblock->pb_xc, parmblock->pb_yc,
  416.                                         parmblock->pb_wc + parmblock->pb_xc - 1,
  417.                                         parmblock->pb_hc + parmblock->pb_yc - 1);
  418.     /* Clip ON */
  419.     vs_clip (Sys->VdiHandle, TRUE, tab);
  420.  
  421.     /* Récupère les attributs et les coordonnées de l'objet */
  422.     x = parmblock->pb_x;
  423.     y = parmblock->pb_y;
  424.     w = parmblock->pb_w;
  425.     h = parmblock->pb_h;
  426.  
  427.     tx = x + 4;
  428.     if (Sys->Yres < 399)
  429.         ty = y + 2;
  430.     else
  431.         ty = y + 4;
  432.  
  433.     xy_bar[0] = x; xy_bar[1] = y;
  434.     xy_bar[2] = x + w - 1; xy_bar[3] = y + h - 1;
  435.  
  436.     vsf_interior(Sys->VdiHandle ,0);
  437.     vswr_mode(Sys->VdiHandle, MD_TRANS);
  438.  
  439.     if (Sys->Nplane < 4)
  440.         lh_color = BLACK;
  441.     else
  442.         lh_color = WHITE;
  443.     back_color = Sys->color_3d1;
  444.     lb_color = Sys->color_3d2;
  445.  
  446.     vsf_interior(Sys->VdiHandle, 1);
  447.     vsf_color(Sys->VdiHandle, back_color);
  448.     v_bar(Sys->VdiHandle, xy_bar);        /* Remplissage Interieur du bouton */
  449.  
  450.     xy_bar[0]++;
  451.     xy_bar[4] = xy_bar[2];
  452.     xy_bar[5] = xy_bar[1] +1;
  453.     xy_bar[1] = xy_bar[3];
  454.     vsl_color(Sys->VdiHandle, lh_color);
  455.     v_pline(Sys->VdiHandle, 3, xy_bar);      /* Trace ligne basse et droite */
  456.     xy_bar[0]--; xy_bar[5]--;
  457.     xy_bar[2] = xy_bar[0];
  458.     xy_bar[3] = xy_bar[5];
  459.     xy_bar[1]--;xy_bar[4]--;
  460.     vsl_color(Sys->VdiHandle, lb_color);
  461.     v_pline(Sys->VdiHandle, 3, xy_bar);      /* Trace ligne gauche et haute */
  462.  
  463.     texte = (char *)parmblock->pb_parm;    /* Récupérer pointeur sur le texte */
  464.     xy_bar[0] = x + 3; xy_bar[1] = y + 5 - Sys->Hchar;
  465.     xy_bar[2] = xy_bar[0] + Sys->Wchar * strlen(texte) + 1; xy_bar[3] = xy_bar[1] + Sys->Hchar - 1;
  466.     vsf_interior(Sys->VdiHandle, 1);
  467.     vsf_color(Sys->VdiHandle, back_color);
  468.     v_bar(Sys->VdiHandle, xy_bar);        /* Remplissage Interieur du bouton */
  469.  
  470.     vst_color (Sys->VdiHandle, WHITE);
  471.     v_gtext (Sys->VdiHandle, tx+1, ty+1, texte);               /* écrire.       */
  472.     vst_color (Sys->VdiHandle, BLACK);
  473.     v_gtext (Sys->VdiHandle, tx, ty, texte);                  /* écrire.       */
  474.  
  475.     vs_clip (Sys->VdiHandle, FALSE, tab);                    /* Clip OFF      */
  476.  
  477.     return (parmblock->pb_currstate & ~SELECTED);
  478. }
  479.  
  480. /*-=< Installation des boutons UserDefs >=-------------------------------*/
  481.  
  482. /*-----------------------------------------------------------------------*
  483.  * Etablissement des boutons USERDEFS                                    *
  484.  *-----------------------------------------------------------------------*/
  485. void set_user(OBJECT *addr_tree)
  486. {
  487.     register int index = 1;                                             /* Objet Racine + 1 */
  488.     OBJECT *addr_obj;
  489.  
  490.     do
  491.     {
  492.         addr_obj = &addr_tree[index];                 /* pointe sur l'objet a traiter */
  493.         if ((addr_obj->ob_type & 0xff) == G_BUTTON)
  494.         {
  495.             switch (addr_obj->ob_type >> 8)
  496.             {
  497.                 case POPUP_B :
  498.                     if (Sys->Yres < 399)
  499.                         addr_obj->ob_height += 8;
  500.                     addr_obj->ob_width += 16;
  501.                     set_objc(addr_obj, popup_button);
  502.                     break;
  503.                 case RADIO_B :
  504.                 case CHECK_B :
  505.                     if (Sys->Yres < 399)
  506.                         addr_obj->ob_height += 8;
  507.                     set_objc(addr_obj, check_button);
  508.                     break;
  509.                 case UNDER_B :
  510.                 case SMALL_B :
  511.                     set_objc(addr_obj, under_button);
  512.                     break;
  513.                 case GROUP_B :
  514.                     set_objc(addr_obj, group_button);
  515.                     break;                
  516.             }
  517.         }
  518.         if (addr_obj->ob_flags & EDITABLE)
  519.             strcpy((addr_obj->ob_spec.tedinfo)->te_ptext, "");
  520.             
  521.         index ++;                                                         /* prepare l'objet suivant ... */
  522.                                                                                     /* ... sauf si dernier objet.  */
  523.     } while(! (addr_obj->ob_flags & LASTOB));
  524. }
  525.  
  526. /*-----------------------------------------------------------------------*
  527.  * Gestion des objets USERDEFS                                           *
  528.  *-----------------------------------------------------------------------*/
  529. static void set_objc(OBJECT *addr_obj, int cdecl (*code)(PARMBLK *parmblock))
  530. {
  531.     register int temp;
  532.     register USERBLK *user;
  533.  
  534.     if ((user = (USERBLK *) malloc(sizeof(USERBLK))) != 0)
  535.     {
  536.         user->ub_code = code;
  537.         addr_obj->ob_type = (addr_obj->ob_type & 0xff00) | G_USERDEF;
  538.         user->ub_parm = (long) addr_obj->ob_spec.userblk;
  539.         addr_obj->ob_spec.userblk = user;
  540.  
  541. /*-= Translation des flags 3D en ob_flags_11 et ob_flags_12. ===========-*/
  542.  
  543.         if ((temp = (addr_obj->ob_flags & ACTIVATOR)) != 0)
  544.         {
  545.             temp <<= 2;
  546.             addr_obj->ob_flags = (addr_obj->ob_flags & ~ACTIVATOR) | temp;
  547.         }
  548.     }
  549. }
  550.  
  551. /*-----------------------------------------------------------------------*/
  552.